Asynkrona funktioner

I JavaScript behöver inte funktioner köras seriellt. En funktion kan schemaläggas att köras i framtiden!
Detta gör att JavaScript aldrig behöver vänta på saker, till exempel att en fil läses från hårddisken eller att data hämtas från en server. Och fler instruktioner kan köras under tiden.

Callback

För att ange vad som ska köras efter att en asynkron funktion är klar, skickas en funktion med i argumenten. Denna funktion brukar kallas callback (visaText i NodeJS exemplet nedan).

var fs = require("fs");
fs.readFile("/etc/passwd", visaText);

console.log("Filen hämtas");

function visaText(err, data) {
	if (err) throw err;
	console.log(data);
}

Funktionen visaText skickas med som argument i metoden fs.readFile som läser filen /etc/passwd från hårddisken.
När filen är inläst körs funktionen visaText med argument för err och data.
Meddelandet "Filen hämtas" visas på skärmen innan filens data visas.

Om det hade varit en synkron funktion, ex: fs.readFileSync hade vi behövt vänta tills den var klar. Och meddelandet "Filen hämtas" skulle visas efter filens data.

Staplade funktioner

Exempel: Läs in texten från X antal filer och skicka sedan texten i ett mail.

function mailaFiler(filer, mailFunktion) {
	var lästaFiler = 0, // Räknare
		text = "";
		
	for(var i=0, i<filer.length; i++) {
		fs.readFile(filer[i], inläst);
	}

	function inläst(err, data) {
		if (err) throw err;
		
		text = text + data;
		
		lästaFiler = lästaFiler + 1;
		
		if(lästaFiler == filer.length) {
			mailFunktion(text);
		}
	}
}

Räknaren lästaFiler håller koll på hur många filer som är inlästa. När alla är inlästa körs mailFunktion med text som argument.

Observera att fil-ordningen kan variera beroende på hur lång tid det tar att läsa in dem.



Denna artikel är skriven av Johan Zetterberg som en del av Johan's JavaScript guide.


Följ mig via RSS:   RSS https://zäta.com/rss.xml (ange adressen i din feed-läsare)